package com.example.消息可靠性.消费方保证.推消息模式;

import com.example.消息可靠性.发送方保证.发送方确认机制.ConfirmConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;

//@Component
public class AckMessage {

    @RabbitListener(queues = ConfirmConfig.CONFIRM_QUEUE)
    public void ackMessage(Message message, Channel channel) {
        //获取此条消息的唯一标志
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            byte[] body = message.getBody();
            String s = new String(body);
            int i = 1/0;
            System.out.println("消息消费成功:" + s);
            //第一个参数:此消息的标记 第二个参数:false表示仅确认当前这条消息 true则表示确认之前所有的消息
            channel.basicAck(deliveryTag,false);
        } catch (Exception e) {
                System.out.println("消息消费失败:" + deliveryTag);
            try {
                //第一个参数:此消息的标记 第二个参数:false表示仅确认当前这条消息 第三个参数:消费失败的消息是否重新回到队列
                channel.basicNack(deliveryTag,false,true);
            } catch (Exception ioException) {
                ioException.printStackTrace();
            }

        }
    }

}
